package api

import (
	"embed"
	"io/fs"
	"log"
	"net/http"
	"time"

	"gitee.com/liumou_site/go-network-monitoring/templates"
	"github.com/gin-gonic/gin"
)

// RouteConfig 路由配置结构体
type RouteConfig struct {
	Version     string
	AppName     string
	Description string
	StartTime   time.Time
}

// RegisterRoutes 注册所有API路由
func RegisterRoutes(r *gin.Engine, embeddedTemplates embed.FS, config RouteConfig) {
	// 创建HTML渲染器
	renderer := templates.NewRenderer()

	// 设置静态文件目录，使用嵌入的文件系统
	// 注意：templates目录下的文件会被映射到/static路径
	if staticFS, err := fs.Sub(embeddedTemplates, "templates"); err == nil {
		r.StaticFS("/static", http.FS(staticFS))
	} else {
		log.Printf("无法获取templates子目录: %v", err)
	}

	// 创建API处理器
	networkAPI := NewNetworkAPIHandler()
	processAPI := NewProcessAPIHandler()
	sseAPI := NewSSEAPIHandler(config.StartTime)
	pageAPI := NewPageAPIHandler(config.StartTime)

	// 注册页面路由
	registerPageRoutes(r, pageAPI, renderer)

	// 注册网络监控API路由
	registerNetworkRoutes(r, networkAPI)

	// 注册系统资源API路由
	registerSystemRoutes(r, pageAPI, config)

	// 注册进程监控API路由
	registerProcessRoutes(r, processAPI)

	// 注册SSE推送路由
	registerSSERoutes(r, sseAPI)
}

// registerPageRoutes 注册页面路由
func registerPageRoutes(r *gin.Engine, pageAPI *PageAPIHandler, renderer *templates.RenderHtml) {
	r.GET("/", pageAPI.Index(renderer))
	r.GET("/process-monitor", pageAPI.ProcessMonitorIndex(renderer))
}

// registerNetworkRoutes 注册网络监控API路由
func registerNetworkRoutes(r *gin.Engine, networkAPI *NetworkAPIHandler) {
	// 网络数据API
	r.GET("/api/network", networkAPI.GetNetworkDataAPI)
	r.GET("/speed", networkAPI.GetSpeedDataAPI)
	r.GET("/api/interfaces", networkAPI.GetInterfaceListAPI())
}

// registerSystemRoutes 注册系统资源API路由
func registerSystemRoutes(r *gin.Engine, pageAPI *PageAPIHandler, config RouteConfig) {
	// 版本信息API
	r.GET("/api/version", pageAPI.GetVersionAPI(config.Version, config.AppName, config.Description))
}

// registerProcessRoutes 注册进程监控API路由
func registerProcessRoutes(r *gin.Engine, processAPI *ProcessAPIHandler) {
	// 进程网络监控相关路由（默认启用）
	r.GET("/api/processes", processAPI.GetAllProcessStatsAPI)                // 获取所有进程数据（直接返回数组）
	r.GET("/api/processes/stats", processAPI.GetProcessStatsSummaryAPI)      // 获取全局统计数据（单一实例）
	r.GET("/api/processes/speed", processAPI.GetProcessSpeedStatsAPI)        // 获取速度统计
	r.GET("/api/processes/:pid", processAPI.GetProcessStatsAPI)              // 获取单个进程统计
	r.GET("/api/processes/connections", processAPI.GetProcessConnectionsAPI) // 获取所有连接
}

// registerSSERoutes 注册SSE推送路由
func registerSSERoutes(r *gin.Engine, sseAPI *SSEAPIHandler) {
	// SSE实时数据推送
	r.GET("/api/sse", sseAPI.SSEDataAPI)
	r.GET("/api/processes/sse", sseAPI.ProcessSSEAPI)
}
